我的15年操作系统开源路——RT-Thread 创始人熊谱翔
放眼全球操作系统市场,从广泛角度来看,可以将其分为三大板块:其一,桌面/PC 端微软打造的 Windows(桌面数字化);其二,手机移动端的苹果和谷歌带来的 iOS 和 Android(移动数字化);下一个时代的物联网(或者未来物理世界的万物数字化)。这里存在一个有趣的现象——前一代的霸主基本上不会成为下一代的领导者,亦或者说其中有着他们原有的基因,如鼠标、键盘操作的 Windows,不可能再带入到手机;手机上广泛且庞大的 Android 也不可能带入到物联网中。
之所以不能,也非常容易理解。因为每一代都会有自己的特点,一定会有一个非常适合它的绝加拍档。对于物联网时代而言,碎片化是其中的显著特点。从超小的计算单元,到具备智能、边缘算力的高性能单元,都会涉及。物联网时代需要一个适配性非常好的操作系统,这些需要创新,也是发力点所在。
始于 2006 年的 RT-Thread 是一款面向物联网的开源操作系统。最初来自于做项目时对嵌入式操作系统的需求,但我对当时数种开源嵌入式操作系统并不满意。我理想中的嵌入式操作系统是,类似 UNIX 系统拥有小写命名方式的优雅代码风格,包括了操作系统内核及周边必备并可裁剪的组件,同时这些又希望它是易于获得、开放、POSIX 标准兼容的。所以,一开始,RT-Thread 便以做一个开放、易用的操作系统为目标。
开放性
之所以选择开放,也和自身受开源文化影响息息相关。1998 年,我首次接触 Linux,知道了除 Windows 以外还有这样一套开放的体系:源码在手天下我有!2000 年,在开始接触系列的商业封闭的实时操作系统(VxWorks、NucleusPLUS、ThreadX 等)后,我深刻体会了东西确实是好东西,稳定可靠,但并不开放:
想找人交流,缺乏相关的技术社区;
想在 PC 上编写相关程序,但并不能放到这些嵌入式实时系统上执行;
想把 Linux 上的开源代码移植过去,基本完全不可能,空坐宝山望洋兴叹。
能做的,只能是基于它自身的 API,完全从头编写。然而,编写一部分还好,但是当要实现所有亦或任意东西时,只能无奈道一句“真是无底洞”!
因为这样的缘由,所以在项目伊始便进行了开源。第一个开源的版本只有线程的部分:能够实现多线程的优先级调度,上下文切换。基于开源,希望它具备更多的开放性,让大家随意获取,同时接受大家反馈,倾听大家的需求。
早期时主要是放在一些论坛上,代码以 Google Code、SVN 的方式进行托管。后来,在论坛上看到大量电子工程师在用 ARM Cortex-M3 的芯片,所以也非常早期地支持了 Cortex-M 架构(这一点相较于诞生更早的 UCOS-ii、ECOS、RTEMS 等),也就迅速获得了大家的关注、尝试。
但是,开放的模式往往意味着发散,因为参与的群体来自各行各业,面临的问题也各式各样。最终,我们实现了支持众多的芯片(有些是我们自己移植的,有些是社区贡献者移植的,有些甚至是芯片厂商移植的)和众多不同的工具,例如不同的工具链、不同的集成开发环境。
在这种情况下,一个社区就必不可少,让大家在其中自由地进行交流,以 Issue、PR、代码的形式,通过线上/线下技术会友的方式进行交流。自 2009 年以来,我们就开始以 Git 的方式管理代码,在 GitHub 上进行协同开发。
图1 RT-Thread Star 增长历史
选择 Git 方式已经成为开源软件的必备:
开源的本质是协同开发,不同于传统开发模式,它需要/可以接受来自远程线上各方的代码补丁;
分布式的协同开发,只要希望合并到主干中,就可以生成 PR 提交,然后经过 Review、沟通、合并,最终出现在开发主干;而不需要自己手动的进行代码合并、比对。
随着 CI(Continuous integration,持续集成)的出现,可以在 CI 中加入代码的检查,编译甚至是自动化测试,降低代码合并上的人工;
在 GitHub 这样的开发者社区中,可以让大家更好的参与进来,对代码进行 Review、确认、提交 Issue/沟通。
易用性
参与到开源社区的一般都是工程师个体,RT-Thread 也是从工程师角度出发,首先通过面向对象设计的模式构造了核心基石,然后再辅以统一化的代码风格,进而形成规范化的开发体验。
对于使用者来说,一份好的文档是开发之路的明灯,从入门上手,到使用指南、注意事项。我们将文档中心按开源、协同开发的模式进行:
以 Markdown 方式进行文本管理;
以 Git 仓库方式接受社区小伙伴的提交;
以Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) 许可协议发布文档。
图2 可以 fork 的 RT-Thread 文档中心
工具是把代码用好的另外一方面。RT-Thread 早期支持的 ARM Cortex-M 处理器,是基于 PC 上的交叉编译方式,所以也就延伸出工具链的问题。GNU GCC 交叉编译工具链,基于 Makefile 方式,免费但使用上缺乏调试器、仿真器;而一些商业的工具链,还可以附带集成开发环境,仿真器,基本上做到类似PC 上使用 VC++ 来编写、开发程序这样简单。所以如何支持好它们也是降低门槛的重点,对此,我们通过深度定制 SCons 的方式把代码的定制、裁剪和这些不同集成开发环境工程文件进行灵活的转换,来实现编译、调试效果。
因为物联网场景碎片化,需要十分灵活的定制性缘故,也引入了开源中常用的 Kconfig 代码配置。字符界面下通过 menuconfig,可以对一些功能特性进行详细的配置,但是这引发了争议,甚至社区上还有反馈表示,“字符界面的配置?这个是科技的倒退吧。”在这样的背景下,以及希望工具层面有更佳配合真正达到开箱即用的出发点,我们后期也开发了专属 RT-Thread 的集成开发环境:RT-Thread Studio。
图3 RT-Thread Studio 集成开发环境
这系列过程中核心点是用户体验,而对于开源操作系统来说,这个就是开发体验:如何真正让开发者用起来顺、爽,真正让开发者喜爱上它。要把开发体验做好,用心倾听社区小伙伴的反馈是必不可少的:
社区小伙伴有系列的吐槽。这时会去琢磨,怎么样才可以做得更好,然后加以改进;
社区小伙伴有更好的点子,代码。这时会 Review 相关的代码/PR,琢磨这样是否确实是一条更好的路。
开源在于过程
开源代表的是协同开发,最大限度的避免重复发明轮子,让大家能够站在巨人的肩膀上创造更大价值。
开源可以有无数的社区小伙伴参与进来,有组织者领导这个项目;有实现代码的开发者,有使用者(同时兼顾测试)进行反馈/提出自己的需求(也有可能转换角色去实现它),还有文档贡献者编写文档或使用笔记;有社区运营,对项目进行运营、推广等。大家都参与其中,作为社区一员,从 0 代码,到大家都使用它,并爱护它。
开源是一种过程的反映,而不是结果:
如果仅仅是一个公司抛出一个产品并开源它,这个并不是真正的开源。如果没有文档,没有后续的社区运营(支持、回复反馈等),这个也仅仅是一堆的代码,开源世界并不缺乏代码;
开源的软件不在于它本身,而在于有多少人使用它。如 Apache 之道(Apache Way)的核心:“社区胜于代码”。代码是“死”的,人是活的,使用软件、代码的是人。
开源也不是一种商业模式,因为它不反馈结果(可以获得多少收入利润),或者可以说开源是一种商业手段。
在开源的过程中,可能很多时候大家也会担心,代码都开源了,有人抄袭了怎么办?有人在这个基础上开新的分支怎么办?同样,不能以静态的方式看这个问题,关键看后续的发展上,谁可以发展得更好(也包括谁的社区会更好)。比较典型的案例有 FreeBSD/DragonFly BSD,NetBSD/OpenBSD,主干在持续推进,融入新功能,产品、社区都做得更棒时,Fork 分支完全不需要担心太多。当然另外一点,商标品牌也十分重要。
在我看来,开源过程持久化,也是 RT-Thread 得以成为常青树的核心:在十多年的时间中,持续地吸收现代化的技术,不断地向前迭代版本。从 MCU 上小巧的完备操作系统(内核、文件系统、网络协议栈),到智能手表上的炫酷人机交互界面(同时低功耗长待机),到现在最新版本,面向带 MMU 处理器架构,全进程版本的 RT-Thread Smart 微内核架构系统。RT-Thread 希望能够像一个火车头,驶向未来。
图4 RT-Thread 路线图,最新的 v5.0 版本将融合 smart 分支
开源与商业化
开源的商业化,这是近些年来大家提及,关注比较多的方面。目前提及的开源下的商业模式普遍来说有三种:
提供服务的模式。类似 Red Hat 这样,代码都是全开源的,提供基于开源代码上的服务,任何相关的都可以算做服务中,例如培训、实施、技术支持等;
Open Core 的模式。即核心是开源的,并让更多人使用起来,而在这个核心基础之上是收费的,例如插件(WordPress),增值中间件等。
Hosting 模式。这也是和云兴起相关,代码是开源的,同时提供云的服务,云空间云服务是收费的。
这其中也出现过 GPL、商业双许可模式,这类通常来说在一定空间范围内也可以行得通,不过整体规模要铺大会比较难,这类最大的案例是 MySQL。而对于 Open-Core 模式来说,也会有个开源 vs 商业的边界:
结语
这篇文章主要是围绕着 10 多年来 RT-Thread 的历程谈及自己的一些想法。这个过程中也和自身的心态相起伏,从兴趣爱好,到创业的艰辛,及看到了开源的大方向及自身优势。在未来几年中,中国工程师的红利也必将推升中国在全球开源界的影响力,也会有更多来自中国的伟大开源项目,形成新时代的根。
熊谱翔,RT-Thread创始人,2000年毕业于重庆邮电学院,先后任职上海贝尔阿尔卡特、宇梦通信、Marvell,拥有丰富的嵌入式实时系统和3G/4G手机基带系统软件开发经验。于2006年创立了RT-Thread开源操作系统,并以开源社区的形式,带领中国国内优秀的工程师,融入实时面向对象设计开发了RT-Thread自主操作系统内核、微内核架构操作系统RT-Thread Smart及大量周边成熟、稳定软件组件,如文件系统,图形用户界面等。
从 Unix 开发者 Brian W. Kernighan 到 OpenCV 创始人 Gary Bradski,再到国内 PingCAP 联合创始人&CTO 黄东旭、Vue.js 作者尤雨溪……《程序员》2.0第一期以「开发者的黄金十年」为主题,与多位国内外知名的技术领袖和新锐代表进行了深度对话,希望为中国开发者打开新时代的「机遇之窗」。
除了技术引领,我们也希望透过技术对行业进行深入洞察。因此,《程序员》2.0 第一期也邀请到了来自快手、滴滴、贝壳找房、作业帮等知名企业的技术负责人,用案例实践为读者阐述直播、出行、居住、在线教育等多个行业变革背后的技术架构和技术引擎。
扫描下方二维码,添加小助手,即刻加入《程序员》2.0「读者群」,抢先一步获取杂志最新资讯,精彩内容不再错过。